﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Tecnosop.Dominio;
using Tecnosop.WebUI.Models;
using Tecnosop.WebUI.Infrastructure.Notification;
using System.Web.UI;

namespace Tecnosop.WebUI.Controllers
{
    [Authorize]
    public partial class InsumoController : Controller
    {
        private Entidades db = new Entidades();

        #region CRUD

        public virtual ViewResult Index()
        {
            var insumo = db.INSUMO.Include(i => i.ITEM);
            return View(insumo.ToList());
        }

        public virtual ViewResult Details(int id)
        {
            INSUMO insumo = db.INSUMO.Find(id);
            return View(new InsumoViewModel
            {
                CODIGO_ITEM = insumo.CODIGO_ITEM,
                BLANCO_Y_NEGRO = insumo.BLANCO_Y_NEGRO ?? false,
                MARCA = insumo.ITEM.MARCA,
                MODELO = insumo.ITEM.MODELO,
                PRECIO = insumo.ITEM.PRECIO,
                //SUBTIPO = insumo.ITEM.SUBTIPO,
                TIPO = insumo.TIPO_INSUMO
            });
        }

        public virtual ActionResult Create()
        {
            ViewBag.TIPO = new SelectList(db.TIPO_INSUMO, "TIPO_INSUMO1", "TIPO_INSUMO1");
            //ViewBag.SUBTIPO1 = new SelectList(db.SUB_TIPO, "SUBTIPO", "SUBTIPO");
            return View();
        } 

        [HttpPost]
        public virtual ActionResult Create(InsumoViewModel insumoVM)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    ITEM item = new ITEM
                    {
                        //CODIGO_ITEM = 0,
                        //TIPO = insumoVM.TIPO,
                        //SUBTIPO = insumoVM.SUBTIPO,
                        PRECIO = insumoVM.PRECIO,
                        MARCA = insumoVM.MARCA,
                        MODELO = insumoVM.MODELO,
                        VISIBLE = true
                    };

                    db.ITEM.Add(item);
                    db.SaveChanges();

                    INSUMO insumo = new INSUMO
                    {
                        CODIGO_ITEM = item.CODIGO_ITEM,//db.ITEM.Last().CODIGO_ITEM,
                        TIPO_INSUMO = insumoVM.TIPO,
                        BLANCO_Y_NEGRO = insumoVM.BLANCO_Y_NEGRO
                    };

                    db.INSUMO.Add(insumo);
                    db.SaveChanges();

                    this.ShowMessage(MessageType.Success, "El insumo ID: [" + insumo.CODIGO_ITEM + "] fue agregado exitosamente.", true);
                    return RedirectToAction("Index");
                }
                catch
                {
                    this.ShowMessage(MessageType.Error, "Ocurrió un error al intentar agregar el insumo.", true);
                    ViewBag.TIPO = new SelectList(db.TIPO_INSUMO, "TIPO_INSUMO1", "TIPO_INSUMO1");
                    //ViewBag.TIPO1 = new SelectList(db.TIPO, "TIPO1", "TIPO1");
                    //ViewBag.SUBTIPO1 = new SelectList(db.SUB_TIPO, "SUBTIPO", "SUBTIPO");
                    return View(insumoVM);
                }
            }

            this.ShowMessage(MessageType.Warning, "Datos incorrectos, dañados o error durante su transmisión.");
            ViewBag.TIPO = new SelectList(db.TIPO_INSUMO, "TIPO_INSUMO1", "TIPO_INSUMO1");
            //ViewBag.TIPO1 = new SelectList(db.TIPO, "TIPO1", "TIPO1");
            //ViewBag.SUBTIPO1 = new SelectList(db.SUB_TIPO, "SUBTIPO", "SUBTIPO");
            return View(insumoVM);
        }

        public virtual ActionResult Edit(int id)
        {
            ViewBag.TIPO1 = new SelectList(db.TIPO_INSUMO, "TIPO_INSUMO1", "TIPO_INSUMO1");
            //ViewBag.TIPO1 = new SelectList(db.TIPO, "TIPO1", "TIPO1");
            //ViewBag.SUBTIPO1 = new SelectList(db.SUB_TIPO, "SUBTIPO", "SUBTIPO");

            INSUMO insumo = db.INSUMO.Find(id);

            InsumoViewModel insumoVM = new InsumoViewModel
            {
                BLANCO_Y_NEGRO = insumo.BLANCO_Y_NEGRO ?? false,
                MARCA = insumo.ITEM.MARCA,
                MODELO = insumo.ITEM.MODELO,
                PRECIO = insumo.ITEM.PRECIO,
                //SUBTIPO = insumo.ITEM.SUBTIPO,
                TIPO = insumo.TIPO_INSUMO,
                CODIGO_ITEM = insumo.ITEM.CODIGO_ITEM
            };

            return View(insumoVM);
        }

        [HttpPost]
        public virtual ActionResult Edit(InsumoViewModel insumoVM)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    INSUMO insumo = db.INSUMO.Find(insumoVM.CODIGO_ITEM);

                    insumo.BLANCO_Y_NEGRO = insumoVM.BLANCO_Y_NEGRO;
                    insumo.ITEM.MARCA = insumoVM.MARCA;
                    insumo.ITEM.MODELO = insumoVM.MODELO;
                    insumo.ITEM.PRECIO = insumoVM.PRECIO;
                    //insumo.ITEM.SUBTIPO = insumoVM.SUBTIPO;
                    insumo.TIPO_INSUMO = insumoVM.TIPO;
                    //insumo.CODIGO_ITEM = insumoVM.CODIGO_ITEM;

                    db.Entry(insumo).State = EntityState.Modified;
                    db.SaveChanges();

                    this.ShowMessage(MessageType.Success, "Cambios guardados correctamente.");
                    return RedirectToAction(Actions.Details(insumoVM.CODIGO_ITEM));
                }
                catch
                {
                    this.ShowMessage(MessageType.Error, "Ocurrió un error al intentar guardar los cambios.");
                    ViewBag.TIPO1 = new SelectList(db.TIPO_INSUMO, "TIPO_INSUMO1", "TIPO_INSUMO1");
                    //ViewBag.TIPO1 = new SelectList(db.TIPO, "TIPO1", "TIPO1");
                    //ViewBag.SUBTIPO1 = new SelectList(db.SUB_TIPO, "SUBTIPO", "SUBTIPO");
                    return View(insumoVM);
                }
            }

            this.ShowMessage(MessageType.Warning, "Datos incorrectos, dañados o error durante su transmisión.");
            ViewBag.TIPO1 = new SelectList(db.TIPO_INSUMO, "TIPO_INSUMO1", "TIPO_INSUMO1");
            //ViewBag.TIPO1 = new SelectList(db.TIPO, "TIPO1", "TIPO1");
            //ViewBag.SUBTIPO1 = new SelectList(db.SUB_TIPO, "SUBTIPO", "SUBTIPO");
            return View(insumoVM);
        }

        public virtual ActionResult Delete(int id)
        {
            INSUMO insumo = db.INSUMO.Find(id);
            return View(new InsumoViewModel
            {
                CODIGO_ITEM = insumo.CODIGO_ITEM,
                BLANCO_Y_NEGRO = insumo.BLANCO_Y_NEGRO ?? false,
                MARCA = insumo.ITEM.MARCA,
                MODELO = insumo.ITEM.MODELO,
                PRECIO = insumo.ITEM.PRECIO,
                //SUBTIPO = insumo.ITEM.SUBTIPO,
                TIPO = insumo.TIPO_INSUMO,
            });
        }

        [HttpPost, ActionName("Delete")]
        public virtual ActionResult DeleteConfirmed(int id)
        {
            try
            {
                INSUMO insumo = db.INSUMO.Find(id);
                db.INSUMO.Remove(insumo);
                db.SaveChanges();

                this.ShowMessage(MessageType.Success, "El insumo fue eliminado exitosamente.");
                return RedirectToAction("Index");
            }
            catch
            {
                this.ShowMessage(MessageType.Error, "Ocurrio un error al intentar eliminar el insumo.");
                return RedirectToAction(Actions.Delete(id));
            }
        }

        #endregion

        #region Validaciones

        #endregion

        #region Busqueda

        [ChildActionOnly]
        public virtual ActionResult Search()
        {
            return PartialView();
        }

        public virtual ActionResult Busqueda()
        {
            return View();
        }

        public virtual ActionResult ResultadoBusqueda(string Criterios, string AreaBusqueda)
        {
            switch (Criterios)
            {
                case "Codigo":
                    int codigo;
                    return View(new ResultadoBusquedaInsumoViewModel
                    {
                        Resultado = Int32.TryParse(AreaBusqueda, out codigo)
                                    ? db.INSUMO.Where(c => c.CODIGO_ITEM == codigo).ToList()
                                    : new List<INSUMO>(),
                        CriterioParaOrdenar = Criterios
                    });
                case "Tipo":
                    return View(new ResultadoBusquedaInsumoViewModel
                    {
                        Resultado = db.INSUMO.Where(c => c.TIPO_INSUMO.Contains(AreaBusqueda)).ToList(),
                        CriterioParaOrdenar = Criterios
                    });
                //case "SubTipo":
                //    return View(new ResultadoBusquedaInsumoViewModel
                //    {
                //        Resultado = db.INSUMO.Where(c => c.ITEM.SUBTIPO.Contains(AreaBusqueda)).ToList(),
                //        CriterioParaOrdenar = Criterios
                //    });
                default:
                    return PartialView(Views.Search);
            }
        }

        #endregion

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}